//
//  IMClientSocket.h
//  IMSecurityDemo
//
//  Created by zhangfan on 2020/6/8.
//  Copyright © 2020 zhangfan. All rights reserved.
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN
@class IMClientSocket;

@protocol IMClientSocketDelegate <NSObject>

@optional

- (void)socket:(IMClientSocket *)socket didReadData:(NSData *)data;

- (void)socketdidWriteData:(IMClientSocket *)socket;

- (void)socketReadDataFailed:(IMClientSocket *)socket withErrorCode:(int)errorCode;

- (void)socketWriteDataFailed:(IMClientSocket *)socket withErrorCode:(int)errorCode;

@end



@interface IMClientSocket : NSObject


@property(nonatomic,weak)id<IMClientSocketDelegate> delegate;

/**
 初始化连接对象

 @param serverCerts 服务端证书列表（base64编码字符串或证书文件路径）
 @param clientEncCert 客户端加密证书(base64编码字符串或证书文件路径)
 @param clientEncKey 客户端加密证书私钥(base64编码字符串或证书文件路径)
 @param clientSignCert 客户端签名证书(base64编码字符串或证书文件路径)
 @param clientSignKey 客户端签名证书私钥(base64编码字符串或证书文件路径)
 @param keyPassword 私钥口令（加密证书与签名证书一致）
 @return 连接对象，失败时返回nil
 */
- (instancetype)initWithServerCerts:(NSArray *)serverCerts
                      clientEncCert:(NSString *)clientEncCert
                       clientEncKey:(NSString *)clientEncKey
                     clientSignCert:(NSString *)clientSignCert
                      clientSignKey:(NSString *)clientSignKey
                        keyPassword:(NSString *)keyPassword;

/**
 初始化连接对象

 @param serverCerts 服务端证书列表
 @param userName 用户名
 @param PIN 证书PIN码
 @param errorCode 错误码
 @return socket对象
 */
- (instancetype)initWithServerCerts:(NSArray *)serverCerts
                           userName:(NSString *)userName
                                PIN:(NSString *)PIN
                          errorCode:(int *)errorCode;

/// 设置服务端证书l
/// @param serverCerts 服务端证书数组
- (void)setServerCerts:(NSArray *)serverCerts;

/**
 设置超时时间
 
 @param timeout 超时时间（单位：秒）
 */
- (void)setTimeOut:(NSTimeInterval)timeout;


/// 建立同步连接
/// @param socket 与目标服务器已建立连接的socket套接字
/// @param timeout 设置ssl超时时间
- (int)syncConnectWithSocket:(long)socket andTimeout:(NSTimeInterval)timeout;

/// 建立同步连接
/// @param socket 与目标服务器已建立连接的socket套接字
/// @param timeout 设置ssl超时时间
- (int)asyncConnectWithSocket:(long)socket andTimeout:(NSTimeInterval)timeout;

/// socket连接
/// @param host 目标地址
/// @param port 目标端口
/// @param timeout 超时时间
- (int)connectHost:(NSString *)host port:(uint16_t)port timeout:(NSTimeInterval)timeout;

/// 接收数据
/// @param timeout 超时时间
- (void)readDataWithTimeout:(NSTimeInterval)timeout;

/// 发送数据
/// @param data 待发送数据
/// @param timeout 超时时间
- (void)writeData:(NSData *)data withTimeout:(NSTimeInterval)timeout;


/// 断开连接
- (void)disconnect;

@end
NS_ASSUME_NONNULL_END
